/*
 * @Description: 主服务启动
 * @Autor: HuiSir<273250950@qq.com>
 * @Date: 2022-04-20 16:28:38
 * @LastEditTime: 2022-06-08 10:57:14
 */
import Koa from 'koa'
import koaBody from 'koa-body'
import { useConfig, print } from 'tcp-micro-service'
import cors from 'koa2-cors'
import microReady from './middleware/microReady.js'
import errorCatch from './middleware/errorCatch.js'
import useKoaBodyOptions from './hooks/useKoaBodyOptions.js'
import router from './router/index.js'
import permission from './middleware/permission.js'

/**
 * 中间件推荐
 * koa2-cors：解决跨域问题
 * koa-static：获得某个目录下的静态文件，和path搭配
 * koa-body：解决文件上传（简单文件上传，只能传到本地）、对body进行处理，处理post数据
 */


// 读取配置
const { server } = useConfig()

// 实例化
const app = new Koa()

// 是否为开发环境
const isDev = process.argv.includes('--dev')

// 开发环境允许跨域
if (isDev) {
    app.use(cors())
    //打印日志
    print.info('已允许跨域')
}

app
    // 错误捕获
    .use(errorCatch(app))
    // Micro 挂载
    .use(microReady())
    // 权限验证、访问过滤
    .use(permission())
    // 处理请求体(入参)中间件
    .use(koaBody(useKoaBodyOptions()))
    // 路由挂载
    .use(router.routes())
    .use(router.allowedMethods())
    // 服务启用
    .listen(server.port, () => {
        //打印端口信息
        print.info(`服务 ${server.name} 启动成功：http://127.0.0.1:${server.port}`)
    }).on('error', (err) => {
        if (err.message.includes('already in use')) {
            print.error('端口被占用，请更改端口后重启程序')
        } else {
            print.error('端口监听失败，咨询管理员 ' + err.message)
        }
    })

// export default app